package LeetCode_力扣;

/**  83. 删除排序链表中的重复元素
 * 给你一个链表的头节点 head 和一个整数 val ，
 * 请你删除链表中所有满足 Node.val == val 的节点，
 * 并返回 新的头节点 。
 */

//第三种，使用创建虚拟头节点方法来
//public class removeElements_203 {
//    public ListNode removeElements(ListNode head, int val) {
//
//        //第二个 方法 只用 一个节点判断
//        ListNode dummyHead = new ListNode();
//        //连接原来链表的头节点
//        dummyHead.next = head;
//
//        ListNode prve = dummyHead;
//
//        while(prve.next != null){
//
//            if(prve.next.val == val){
//                prve.next = prve.next.next;
//            }else{
//                prve = prve.next;
//            }
//        }
//    return dummyHead.next;

        //第一种常规写法
        //需要先判断下链表是否为空
//        if(head == null)
//            return null;
//        ListNode prve = dummyHead;
//        ListNode node = prve.next;
//        while(node != null){
//
//            if(node.val == val){
//                node = node.next;
//                prve.next = node;
//            }else{
//                prve = node;
//                node = node.next;
//            }
//        }
//        return dummyHead.next;
//    }
//}
//


//第二种：递归写法
/**
 * 思路就是，我们可以拆分成：我们只负责解决头结点的待删除问题，省下的交给方法去完成并返回地址。
 */
//public class removeElements_203 {
//    public ListNode removeElements(ListNode head, int val) {
//
//        //1.什么情况下不需要拆分了？：终止条件
//        if( head == null ){
//            return null;
//        }else{
//            //要用head.next来接收子函数的返回值
//            //不然递归里面的删除影响不到外面的值
//           head.next =  removeElements(head.next, val);
//            if(head.val == val){
//                head = head.next;
//            }
//        }
//        return head;
//    }
//}


//第一种常规写法
//public class removeElements_203 {
//    public ListNode removeElements(ListNode head, int val) {
//         //保证头节点不是待删除的数
//        //1.必须先保证heal不是空指针，才能继续访问里面的val值
//        while(head != null && head.val == val){
//            //1.0
////            ListNode node = head;
////            head = node.next;
////            node.next = null;
//            //其实题目里给的链表，不需要考虑回收、释放的问题，可以直接支这样写
//            //2.0
//            head = head.next;
//        }
//        //走到这就保证了头节点不再是待删除的数
//        //先判空
//        if(head == null){
//            return null;
//        }else{
//            ListNode prve = head;
//            while(prve.next != null ){
//                if( prve.next.val == val ) {
//                    prve.next = prve.next.next;
//                }else{
//                    prve = prve.next;
//                }
//
//            }
//        }
//        return head;
//    }
//}


//class ListNode {
//    int val;
//    ListNode next;
//
//    ListNode() {
//    }
//
//    ListNode(int val) {
//        this.val = val;
//    }
//
//    ListNode(int val, ListNode next) {
//        this.val = val;
//        this.next = next;
//    }
//}
